package com.kiloai.base.okgohttp.callback;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.kiloai.base.okgohttp.entity.Data;
import com.kiloai.base.okgohttp.exception.ApiException;
import com.kiloai.base.utils.LogUtil;
import com.lzy.okgo.callback.AbsCallback;

import java.lang.reflect.Type;

import okhttp3.Response;

/**
 * Created by david on 2018/3/5.
 */

public abstract class JsonCallback<T> extends AbsCallback<T> {
    protected Type type;

    public JsonCallback() {
    }

    public JsonCallback(Type type) {
        this.type = type;
    }

    /**
     * 该方法是子线程处理，不能做ui相关的工作
     * 主要作用是解析网络返回的 response 对象,生产onSuccess回调中需要的数据对象
     * 这里的解析工作不同的业务逻辑基本都不一样,所以需要自己实现,以下给出的时模板代码,实际使用根据需要修改
     */
    @Override
    public T convertResponse(Response response) throws Throwable {

        JsonReader jsonReader = new JsonReader(response.body().charStream());
        if (jsonReader == null) {
            return null;
        }

        Gson gson = new Gson();
        if (type == null) {
            type = new TypeToken<Data>() {
            }.getType();
        }
        Data data = gson.fromJson(jsonReader, type);
        if (data.getCode() == 0) {
            return (T) data.getData();
        } else if (data.getCode() == 401) {
            throw new ApiException(data.getMsg());
        } else {
            throw new ApiException("error:" + data.getMsg());
        }

    }

    @Override
    public void onError(com.lzy.okgo.model.Response<T> response) {
        super.onError(response);
        if (response.getException().getMessage() != null) {
            LogUtil.e("JsonCallback error:", response.getException().getMessage().toString());
        }
    }

    @Override
    public void onFinish() {
        super.onFinish();

    }
}
